# -*- coding: utf-8 -*-
from flask import Flask, request, jsonify, render_template, Response
import requests
import json
from common.data.element_selectors import CHAT_MESSAGE_ANSWER, CHAT_MESSAGE, ANSWER_MARKDOWN, WEB_CSS
from lib.utils.redis_util import get_redis_client
import time


app = Flask(__name__)


@app.route("/", methods=["GET"])
def index():
    redis_client = get_redis_client()
    css = redis_client.get(WEB_CSS)
    return render_template("chat.html", css=css)


# 处理POST请求的聊天功能
@app.route("/chat", methods=["POST"])
def chat():
    """
    与OpenAI API进行交互，根据用户输入的消息，返回AI生成的回复。

    参数:
    - messages: 用户输入的提示信息，必须以JSON格式提供。
    - apiKey: 用户的OpenAI API密钥。如果未提供，则使用应用配置中的密钥。
    - model: 使用的OpenAI模型，默认为"gpt-3.5-turbo"。

    返回值:
    - 返回一个JSON对象，包含AI生成的回复或者错误信息。
    """
    redis_client = get_redis_client()
    # 从请求中获取输入消息和API密钥
    messages = request.form.get("prompts", None)

    prompts = json.loads(messages)

    # 遍历字典列表
    for item in prompts:
        # 访问当前字典的 "content" 字段并将其值添加到 "contents" 列表中
        message = item["content"]

    # 检查是否提供了必要的输入
    if messages is None:
        return jsonify({"error": {"message": "请输入prompts！", "type": "invalid_request_error", "code": ""}})

    # 将输入的消息写入Redis
    redis_client.set(CHAT_MESSAGE, message)

    # 从Redis获取回复并显示
    while not redis_client.exists(CHAT_MESSAGE_ANSWER):
        time.sleep(1)  # 如果还没有回复，继续等待

    # 从Redis获取回复并显示
    response = redis_client.get(CHAT_MESSAGE_ANSWER)
    # print(response)
    redis_client.delete(CHAT_MESSAGE_ANSWER)

    # 定义一个生成器，以流式处理API的响应
    def generate():
        # 按需将文本内容分隔成多段（例如，按行、按特定分隔符等）
        if isinstance(response, str):
            # 分割文本，例如按换行符分隔
            lines = response.split("\n")
            for line in lines:
                yield line + "\n"
        elif isinstance(response, bytes):
            # 如果缓存内容是字节串，先解码为字符串，再分割
            decoded_text = response.decode("utf-8")  # 假设使用UTF-8编码
            lines = decoded_text.split("\n")
            for line in lines:
                yield line + "\n"
        else:
            raise ValueError("Unsupported content type")
        # 清除回复，准备下一轮对话

    # 返回响应
    return Response(generate(), content_type='application/octet-stream')


if __name__ == '__main__':
    redis_client = get_redis_client()
    if redis_client.exists(WEB_CSS):
        redis_client.set(ANSWER_MARKDOWN, 1)
        app.run(host='0.0.0.0', port=5000)
    else:
        print("请先启动转发端")
